10554a
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2015 the original author or authors.
+ * Copyright 2002-2016 the original author or authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -46,7 +46,7 @@
public class SimpleTransactionScope implements Scope {
 		ScopedObjectsHolder scopedObjects = (ScopedObjectsHolder) TransactionSynchronizationManager.getResource(this);
 		if (scopedObjects == null) {
 			scopedObjects = new ScopedObjectsHolder();
-			TransactionSynchronizationManager.registerSynchronization(new CleanupSynchronization());
+			TransactionSynchronizationManager.registerSynchronization(new CleanupSynchronization(scopedObjects));
 			TransactionSynchronizationManager.bindResource(this, scopedObjects);
 		}
 		Object scopedObject = scopedObjects.scopedInstances.get(name);
@@ -98,13 +98,30 @@
public class SimpleTransactionScope implements Scope {
 
 	private class CleanupSynchronization extends TransactionSynchronizationAdapter {
 
+		private final ScopedObjectsHolder scopedObjects;
+
+		public CleanupSynchronization(ScopedObjectsHolder scopedObjects) {
+			this.scopedObjects = scopedObjects;
+		}
+
+		@Override
+		public void suspend() {
+			TransactionSynchronizationManager.unbindResource(SimpleTransactionScope.this);
+		}
+
+		@Override
+		public void resume() {
+			TransactionSynchronizationManager.bindResource(SimpleTransactionScope.this, this.scopedObjects);
+		}
+
 		@Override
 		public void afterCompletion(int status) {
-			ScopedObjectsHolder scopedObjects = (ScopedObjectsHolder)
-					TransactionSynchronizationManager.unbindResourceIfPossible(SimpleTransactionScope.this);
-			for (Runnable callback : scopedObjects.destructionCallbacks.values()) {
+			TransactionSynchronizationManager.unbindResourceIfPossible(SimpleTransactionScope.this);
+			for (Runnable callback : this.scopedObjects.destructionCallbacks.values()) {
 				callback.run();
 			}
+			this.scopedObjects.destructionCallbacks.clear();
+			this.scopedObjects.scopedInstances.clear();
 		}
 	}
 
